package com.company.jdk8;

import com.company.entity.Boy;
import com.company.entity.Girl;
import org.junit.Test;
import org.omg.CORBA.PUBLIC_MEMBER;

import java.util.Optional;

/**
 * @ProjectName: 复习java
 * @Package: com.company.jdk8
 * @ClassName: OptionalTest
 * @Author: wym
 * @Date: 2020/9/15 9:44
 * @Version: 1.0
 *
 *
 *避免空指针异常 二创建的
 * 经常使用的方法 ：ofNullable(T t)
 * orElse(T t)
 */

/**
 * Optional.of(T t) 创建一个 Optional 实例 t 必须非空
 * Optional.empty() :创建一个空 的Optional 实例
 * Optional.ofNullable(T t) t可以为null
 *
 */
public class OptionalTest {
    @Test
    public  void test(){
//        Employee weng = new Employee();
//        //创建一个 Optional 实例
//        Optional<Employee> weng1 = Optional.of(weng);
//        //创建一个空的 Optional 实例
//        Optional<Employee> empty = Optional.empty();
//
//        System.out.println(weng1);
//        System.out.println("-----------------");
        Girl girl = new Girl();
        Optional<Girl> girl1 = Optional.of(girl);
        System.out.println(girl1);
    }
    @Test
    public void  test2(){
        Girl girl = new Girl();
//        girl = null;
        //ofNullable(T t)：t可以为null
        Optional<Girl> optionalGirl = Optional.ofNullable(girl);
        System.out.println(optionalGirl);
        //orElse(T t1):如果单前的Optional内部封装的t是非空的，则返回内部的t.
        //如果内部的t是空的，则返回orElse()方法中的参数t1.
        Girl girl1 = optionalGirl.orElse(new Girl("赵丽颖"));
        System.out.println(girl1);
    }

    public String getGirlName(Boy boy){
        return boy.getGirl().getName();
    }
    @Test
    public void  test3(){
        Boy boy = new Boy();
        boy=null;
        String girlName = getGirlName(boy);
        System.out.println(girlName);
    }
    //优化以后的getGirlName()
    public String getGirlName1(Boy boy){
        if (boy!=null){
            Girl girl = boy.getGirl();
            if (girl!=null){
                return girl.getName();
            }
        }
        return null;
    }
    @Test
    public void  test4(){
        Boy boy = new Boy();
        boy=null;
        String girlName = getGirlName1(boy);
        System.out.println(girlName);
    }

    //Optional类的getGirlName()
    public String getGirlName2(Boy boy){
        //可以为空的
        Optional<Boy> boyOptional = Optional.ofNullable(boy);
        //此时的boy1  一定非空
        Boy boy1 = boyOptional.orElse(new Boy(new Girl("迪丽热巴")));
        Girl girl = boy1.getGirl();

        Optional<Girl> girlOptional = Optional.ofNullable(girl);
        Girl girl1 = girlOptional.orElse(new Girl("古力娜扎"));
        return  girl1.getName();
    }
    @Test
    public void  test5(){
        Boy boy=null;
        boy = new Boy();
       // boy = new Boy(new Girl("老师"));
        String girlName = getGirlName2(boy);
        System.out.println(girlName);
    }
}
